//路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问)
import router from "@/router";
import setting from "./setting";
//@ts-ignore
import nprogress from "nprogress";
//引入进度条样式
import "nprogress/nprogress.css";
nprogress.configure({ showSpinner: false });
//获取用户相关的小仓库内部token数据,去判断用户是否登录成功
import useUserStore from "./store/modules/user";
import pinia from "./store";
const userStore = useUserStore(pinia);
//全局守卫:项目当中任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to: any, _from: any, next: any) => {
  document.title = `${setting.title} - ${to.meta.title}`;
  nprogress.start();
  function hasPermission(roles: any, to: any) {
    // 检查路由是否需要权限
    if (to.meta && to.meta.requiresAuth) {
      // 如果路由需要权限，则检查用户是否登录
      if (!roles || roles.length === 0) {
        // 用户未登录，没有权限
        return false;
      }
      // 检查路由是否设置了角色要求
      if (to.meta.roles && to.meta.roles.length > 0) {
        // 如果路由设置了角色要求，则检查用户是否拥有所需角色
        return roles.some((role: any) => to.meta.roles.includes(role));
      }
      // 如果路由未设置角色要求，则表示任何登录用户都有权限访问
      return true;
    }
    // 如果路由不需要权限，则任何用户都有权限访问
    return true;
  }
  const token = sessionStorage.getItem("X-Access-Token");
  const username = userStore.user.nickname;
  // next();
  if (token) {
    if (to.path === "/login") {
      next({ path: "/home" });
    } else {
      if (username) {
        // 用户已登录
        // 获取用户角色信息
        const roles = userStore.user.roles; // 从后端获取用户角色信息的方法，你需要实现这个方法
        // 检查路由权限
        if (hasPermission(roles, to)) {
          next(); // 有权限，放行
        } else {
          next({ path: "/404" }); // 没有权限，跳转到403页面或其他提示页面
        }
      } else {
        try {
          await new Promise<void>((resolve, reject) => {
            userStore
              .userInfo()
              .then(() => resolve())
              .catch((error) => reject(error));
          });
          next();
        } catch (error) {
          await userStore.UserLogout();
          next({ path: "/login" });
        }
      }
    }
  } else {
    if (to.path === "/login") {
      next();
    } else {
      next({ path: "/login" });
    }
  }
});
//全局后置守卫
router.afterEach((_to: any, _from: any) => {
  nprogress.done();
});

//第一个问题:任意路由切换实现进度条业务 ---nprogress
//第二个问题:路由鉴权(路由组件访问权限的设置)
//全部路由组件:登录|404|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(四个子路由)

//用户未登录:可以访问login,其余六个路由不能访问(指向login)
//用户登录成功:不可以访问login[指向首页],其余的路由可以访问
